#include "App_Key.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

// 全局变量记录按键状态
static key_state_t key_state = KEY_STATE_IDLE;
static key_type_t current_key = KEY_NONE;
static uint32_t key_press_time = 0;

// 按键电压范围定义
#define KEY2_VOLTAGE_MAX 10
#define KEY3_VOLTAGE_MIN 1640
#define KEY3_VOLTAGE_MAX 1660
#define KEY4_VOLTAGE_MIN 2180
#define KEY4_VOLTAGE_MAX 2200
#define KEY5_VOLTAGE_MIN 2455
#define KEY5_VOLTAGE_MAX 2475
#define NO_KEY_VOLTAGE_MIN 2900

// 消抖时间（毫秒）
#define DEBOUNCE_TIME_MS 20

void App_Key_Init(void) {
    Dri_ADC_Init();
    key_state = KEY_STATE_IDLE;
    current_key = KEY_NONE;
    key_press_time = 0;
}

// 根据电压值识别按键类型
static key_type_t App_Key_Identify(int voltage) {
    if (voltage <= KEY2_VOLTAGE_MAX) {
        return KEY_2;
    } else if (voltage > KEY3_VOLTAGE_MIN && voltage <= KEY3_VOLTAGE_MAX) {
        return KEY_3;
    } else if (voltage > KEY4_VOLTAGE_MIN && voltage <= KEY4_VOLTAGE_MAX) {
        return KEY_4;
    } else if (voltage > KEY5_VOLTAGE_MIN && voltage <= KEY5_VOLTAGE_MAX) {
        return KEY_5;
    } else if (voltage > NO_KEY_VOLTAGE_MIN) {
        return KEY_NONE;
    }

    // 电压值不在任何已知范围内
    return KEY_NONE;
}

// 获取按键状态并处理
key_type_t App_Key_GetKey(void) {
    int key_voltage = Dri_ADC_GetVoltage();
    key_type_t detected_key = App_Key_Identify(key_voltage);
    uint32_t current_time = xTaskGetTickCount();
    key_type_t result = KEY_NONE;

    switch (key_state) {
    case KEY_STATE_IDLE:
        if (detected_key != KEY_NONE) {
            // 检测到按键按下，进入按下状态
            current_key = detected_key;
            key_state = KEY_STATE_PRESSED;
            key_press_time = current_time;
        }
        break;

    case KEY_STATE_PRESSED:
        if (current_time - key_press_time > pdMS_TO_TICKS(DEBOUNCE_TIME_MS)) {
            // 消抖时间已过
            if (detected_key == current_key) {
                // 确认按键按下，进入确认状态
                key_state = KEY_STATE_CONFIRMED;
                result = current_key; // 返回按键值
            } else {
                // 按键状态变化，可能是抖动，回到空闲状态
                key_state = KEY_STATE_IDLE;
                current_key = KEY_NONE;
            }
        }
        break;

    case KEY_STATE_CONFIRMED:
        if (detected_key == KEY_NONE || detected_key != current_key) {
            // 按键释放或按键变化，进入释放状态
            key_state = KEY_STATE_RELEASED;
        }
        break;

    case KEY_STATE_RELEASED:
        // 确保按键完全释放后再回到空闲状态
        if (detected_key == KEY_NONE) {
            key_state = KEY_STATE_IDLE;
            current_key = KEY_NONE;
        }
        break;
    }

    return result;
}

extern void App_Display_ShowPIN(void);

// 主任务循环中调用此函数处理按键
void App_Key_Process(void) {
    key_type_t key = App_Key_GetKey();

    if (key != KEY_NONE) {
        switch (key) {
        case KEY_2:
            // MY_LOGE("按键2按下");
            // 打开继电器
            Inf_Relay_Open();
            // 亮起LED3、4
            Inf_LED_OpenSpecify(LED3);
            Inf_LED_OpenSpecify(LED4);
            break;

        case KEY_3:
            // MY_LOGE("按键3按下");
            // 关闭继电器
            Inf_Relay_Close();
            // 关闭LED3、4
            Inf_LED_CloseSpecify(LED3);
            Inf_LED_CloseSpecify(LED4);
            break;

        case KEY_4:
            // MY_LOGE("按键4按下");
            // OLED清屏
            oled_clear();
            App_Display_ShowPIN();
            break;

        case KEY_5:
            // MY_LOGE("按键5按下");
            // 连接Wifi
            // Dri_Wifi_Init();
            break;

        default:
            break;
        }
    }
}

/*
// 我的捞比代码

// void App_Key_Init(void) {
//     Dri_ADC_Init();
// }

// // 获取哪个按键被按下
// void App_Key_GetKeyNum(void) {
//     int key_Voltage = Dri_ADC_GetVoltage();
//     if (key_Voltage <= 10) {
//         // 消抖
//         while (Dri_ADC_GetVoltage() <= 10) {
//         }
//         MY_LOGE("按键2");

//     } else if (1640 < key_Voltage && key_Voltage <= 1660) {
//         // 消抖
//         while (Dri_ADC_GetVoltage() <= 1660) {
//         }
//         MY_LOGE("按键3");

//     } else if (2180 < key_Voltage && key_Voltage <= 2200) {
//         // 消抖
//         while (Dri_ADC_GetVoltage() <= 2200) {
//         }
//         MY_LOGE("按键4");

//     } else if (2455 < key_Voltage && key_Voltage <= 2475) {
//         // 消抖
//         while (Dri_ADC_GetVoltage() <= 2475) {
//         }
//         MY_LOGE("按键5");

//     } else if (key_Voltage > 2900) {
//         // MY_LOGE("无按键");
//     }
// }
*/
